/*
 * Vector.h
 *
 *  Created on: 28/04/2012
 *      Author: lucas
 */

#ifndef VECTOR_H_
#define VECTOR_H_

#include <stdbool.h>
#include <string.h>

template <class T>
class Vector {
public:
	int append(T dato);
	T& operator[](size_t id);
	Vector();
	void limpiar();
	virtual ~Vector();
	// Devuelve true si contiene al dato, false en caso contrario
	// Pre: la clase T debe tener definido el operador '=='
	bool contiene(T dato);
	size_t getLargo() const {
		return largo;
	}
	T* getBuffer() const {
		return buffer;
	}
private:
	size_t largo;
	size_t tamanio;
	T* buffer;
	int redimensionar(size_t nuevoTamanio);
};

template<class T>
int Vector<T>::append(T dato) {
	if(largo >= tamanio)
		if(redimensionar(tamanio * 2 / 1) == -1)
			return -1;
	buffer[largo] = dato;
	largo++;
	return 0;
}

template<class T>
bool Vector<T>::contiene(T dato) {
	for(size_t i = 0; i < largo; i++)
		if (buffer[i] == dato) return true;
	return false;
}

template<class T>
inline T& Vector<T>::operator[](size_t id) {
	return buffer[id];
}

template<class T>
int Vector<T>::redimensionar(size_t nuevoTamanio) {
	T* nuevoBuffer = new T[nuevoTamanio];
	if(!nuevoBuffer)
		return -1;
	for(unsigned int i = 0; i < largo; i++)
		nuevoBuffer[i] = buffer[i];
	delete[] buffer;
	buffer = nuevoBuffer;
	tamanio = nuevoTamanio;
	return 0;
}

template <class T>
Vector<T>::Vector() : largo(0), tamanio(2) {
	buffer = new T[tamanio];
}

template <class T>
void Vector<T>::limpiar() {
	largo = 0;
	tamanio = 2;
	delete[] buffer;
	buffer = new T[2];
}

template <class T>
Vector<T>::~Vector() {
	delete[] buffer;
}

#endif /* VECTOR_H_ */
